package jezyk_java.biblioteka;

import java.io.*;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Biblioteka {
    private ArrayList<Ksiazka> pojemnikNaKsiazki = new ArrayList<Ksiazka>();

    public int dodajKsiazke(Ksiazka k) {
        int id = pojemnikNaKsiazki.size();
        pojemnikNaKsiazki.add(k);
        System.out.println("Pomyślnie dodano książkę.");
        return id;
    }

    public void dodawanieKsiazek() {
        Scanner scanner = new Scanner(System.in);
        int rokWydania = 0;
        System.out.println("Dodawanie nowej książki");
        System.out.print("Autor: ");
        String autor = scanner.next();
        System.out.print("Rok wydania: ");
        try {
            rokWydania = scanner.nextInt();
        } catch (InputMismatchException e) {
            System.out.println("Nie podałeś właściwej liczby. Spróbuj jeszcze raz.");
            dodawanieKsiazek();
            return;
        }
        System.out.print("Tytuł: ");
        String tytul = scanner.next();
        System.out.print("Wydawnictwo: ");
        String wydawnictwo = scanner.next();

        Ksiazka k = new Ksiazka(autor, tytul, wydawnictwo, rokWydania);

        dodajKsiazke(k);
    }

    public void pokazKsiazki() {
        if (pojemnikNaKsiazki.size() == 0)
            System.out.println("Nie ma książek w bibliotece");
        else {
            System.out.println("Książki znajdujące się w bibliotece:");
            for (Ksiazka ks : pojemnikNaKsiazki) {
                System.out.println(ks);
            }
        }
    }

    public int znajdzKsiazke(String tytul, String autor) {
        for (Ksiazka ks : pojemnikNaKsiazki) {
            System.out.println("tytul: " + ks.getTytul());
            if (ks.getTytul().equals(tytul) || ks.getAutor().equals(autor))
                return pojemnikNaKsiazki.indexOf(ks);
        }
        return -1;
    }

    public void znajdywanieKsiazki() {
        Scanner scanner = new Scanner(System.in);

        System.out.println();
        System.out.println("Znajdywanie książki");
        System.out.print("Podaj tytuł książki: ");
        String tytul = scanner.next();
        System.out.print("Podaj autora książki: ");
        String autor = scanner.next();

        int id = znajdzKsiazke(tytul, autor);
        if (id == -1)
            System.out.println("Nie ma takiej ksiazki");
        else {
            Ksiazka ksiazka = pojemnikNaKsiazki.get(id);
            System.out.println("Znaleziono szukana ksiazke o id: " + ksiazka.getId());
            pokazInformacjeOKsiazce(id);
        }
    }

    private void pokazInformacjeOKsiazce(int id) {
        Ksiazka k = pojemnikNaKsiazki.get(id);
        System.out.println(k);
    }

    public boolean zapiszDane(String filename) {
        if (pojemnikNaKsiazki.size() == 0) {
            System.out.println("Nie masz zapisanych książek w bibliotece, więc nie ma czego zapisć do pliku.");
            return false;
        } else {
            try {
                PrintWriter zapis = new PrintWriter(filename);
                for (Ksiazka ks : pojemnikNaKsiazki) {
                    zapis.println(ks.getAutor() + " " +
                            ks.getTytul() + " " +
                            ks.getRokWydania() + " " +
                            ks.getWydawnictwo() + " " +
                            ks.getCzyWypozyczona());
                }
                zapis.close();

            } catch (FileNotFoundException e) {
                System.out.println("Błąd z zapisem pliku: " + e);
            }

            System.out.println("Pomyślnie zapisano dane do pliku");

            return true;
        }
    }

    public boolean wczytajDane(String filename) {
        String linia;
        try {
            File odczyt = new File(filename);
            Scanner in = new Scanner(odczyt);
            pojemnikNaKsiazki = new ArrayList<Ksiazka>();

            if (in.hasNext()) {
                System.out.println("Książki wczytane z pliku:");

                while (in.hasNext()) {
                    linia = in.nextLine();

                    StringTokenizer tokenizer = new StringTokenizer(linia);
                    String autor = tokenizer.nextToken();
                    String tytul = tokenizer.nextToken();
                    int rokWydania = Integer.parseInt(tokenizer.nextToken());
                    String wydawnictwo = tokenizer.nextToken();
                    boolean czyWypozyczona = Boolean.parseBoolean(tokenizer.nextToken());
                    Ksiazka ksiazka = new Ksiazka(autor, tytul, wydawnictwo, rokWydania);
                    ksiazka.setCzyWypozyczona(czyWypozyczona);
                    System.out.println(ksiazka);
                    pojemnikNaKsiazki.add(ksiazka);
                }
            } else {
                System.out.println("Nie ma książek zapisanych w pliku.");
            }


            in.close();
        } catch (FileNotFoundException ex) {
            System.out.println(ex.getMessage());
        }

        return true;
    }


    public boolean zapiszDaneNew(String filename) {
        if (pojemnikNaKsiazki.size() == 0) {
            System.out.println("Nie masz zapisanych książek w bibliotece, więc nie ma czego zapisć do pliku.");
            return false;
        } else {
            try {
                FileOutputStream fileOutputStream = new FileOutputStream(filename);
                ObjectOutputStream out = new ObjectOutputStream(fileOutputStream);

                for (Ksiazka ksiazka : pojemnikNaKsiazki) {
                    out.writeObject(ksiazka);
                }
                out.close();
                System.out.println("Pomyślnie zapisano ksiazki");
            } catch (Exception e) {
                System.out.println("Wystąpil blad przy zapisie ksiazek");
                return false;
            }

        }
        return true;
    }


    public boolean wczytajDaneNew(String fileName) {
        try {
            FileInputStream fileInputStream = new FileInputStream(fileName);
            ObjectInputStream in = new ObjectInputStream(fileInputStream);

            while (true) {
                try {
                    pojemnikNaKsiazki.add((Ksiazka)in.readObject());
                } catch (EOFException e) {
                    System.out.println("Pomyslnie wczytano ksiazki z pliku");
                    return true;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Wystąpil blad przy wczytywaniu ksiazek z pliku");
            return false;
        }
    }

    public void wymazKsiazkiZBiblio() {
        if (pojemnikNaKsiazki.size() == 0) {
            System.out.println("Nie ma książek w bibliotece, więc nie ma co usunąć.");
        } else {
            pojemnikNaKsiazki.clear();
            System.out.println("Wyczyszczono książki z biblioteki.");
        }
    }

    public boolean wymazPlik(String filename) {
        try {
            FileWriter fw = new FileWriter(filename);
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("Pomyślnie wykasowano dane z pliku");

        return true;
    }

    public boolean wypozyczKsiazke(int id) throws IndexOutOfBoundsException {
        if (pojemnikNaKsiazki.get(id).getCzyWypozyczona()) {
            return false;
        } else {
            pojemnikNaKsiazki.get(id).setCzyWypozyczona(true);
            return true;
        }
    }

    public boolean oddajKsiazke(int id) throws IndexOutOfBoundsException {
        if (!pojemnikNaKsiazki.get(id).getCzyWypozyczona()) {
            return false;
        } else {
            pojemnikNaKsiazki.get(id).setCzyWypozyczona(false);
            return true;
        }
    }
}